package com.xinggq.common.utils;

import com.xinggq.common.exception.AbstractCommonException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils;

/**
 * 优雅的使用BeanUtils对List集合的操作
 *
 * @author ZhangYajun
 * @since 2023-06-06 19:30
 */
public class ColaBeanUtils extends BeanUtils {

  /**
   * 拷贝对象
   *     Tenant sourceObj = new Tenant();
   *     TenantResDTO dtoObj = ColaBeanUtils.copyProperties(sourceObj, TenantResDTO::new);
   *
   * @param sources 原对象
   * @param target 创建目标对象
   * @return 目标对象
   */
  public static <S, T> T copyProperties(S sources, Supplier<T> target) {
    if (null == sources) {
      return null;
    }
    T t = target.get();
    copyProperties(sources, t);
    return t;
  }

  /**
   * 批量转换指定列表的类型
   *
   * @param sources     待转换类型列表
   * @param targetClass 待转换的类型
   * @param <S>         原类型
   * @param <T>         转换后的类型
   * @return 类型为targetClass类型的列表
   * @author wxh
   * @since 2023/9/25 13:54
   */
  @SuppressWarnings("unchecked")
  public static <S, T> List<T> castList(List<S> sources, Class<T> targetClass) {
    if (targetClass == null) {
      throw AbstractCommonException.paramError("待转换类型不能为空");
    }
    if (ObjectUtils.isEmpty(sources)) {
      return new ArrayList<>();
    }
    return sources.stream().map(source -> {
      if (source == null) {
        return null;
      }
      if (targetClass.isInstance(source)) {
        return (T) source;
      } else {
        throw AbstractCommonException.paramError(
            "source 类型 " + source.getClass() + " 不能转换为 targetClass 类型 " + targetClass);
      }
    }).collect(Collectors.toList());
  }
}
